//配置路由的地方
import Vue from 'vue';
import VueRouter from "vue-router"
import routes from './routes'
import store from '@/store'
//使用插件
Vue.use(VueRouter);

//先把VueRouter原型对象的push  先保存一份
//相当于  this.$router.push({
//   name:"search",
//   params:{keyword:this.keyword},
//   query:{k:this.keyword.toUpperCase()}
// })
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//重写push  ||replace
//第一个参数：告诉原来push方法  你往哪里跳转（传递哪些参数）

//第二个参数  成功的回调
// 第三个参数   失败的回调

VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    //call||apply区别
    //相同点 都可以调用函数一次 都可以篡改函数的上下文一次
    //不同点 call与apply传递参数 call用逗号隔开 apply方法执行 传递数组
    //不能直接originPush()这样调用 this指向window  需要用call改变this指向
    //传了成功和失败的回调
    originPush.call(this, location, resolve, reject);

  } else {
    //没有传的话添加成功和失败的回调
    originPush.call(this, location, () => {}, () => {})
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {

    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => {}, () => {})
  }
}


//配置路由
let router = new VueRouter({

  //配置路由
  routes,
  //滚动行为
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    //返回的这个y=0代表滚动条在最上方
    // y为几代表离顶端的距离
    return {
      y: 0
    }
  },
})
// 全局守卫  前置守卫（在路由跳转之前判断能不能进行路由跳转）
router.beforeEach(async (to,from,next)=>{
  // to 获取到要跳转的到的路由信息
  // from  获取到从哪个路由跳转过来的信息
  // next   放行  next()   next(path) 放行到指定路由
  // 方便测试   全部放行
  // 登录了不能回login （登录不能再登录） 
  // home页 this.$store.dispatch('getUserInfo')  一挂载就获取用户信息
  // 别的页没有派发获取信息 一刷新就没有用户信息
  // next()
  // 在守卫这拿到仓库  拿到仓库 拿到token 确定用户是否登录
// 获取仓库中的token ---可以确定用户登录了
  let token = store.state.user.token 
  // 获取用户名字 有名字代表有用户信息
  let name = store.state.user.userInfo.name

  // 用户登录了
  if(token){
    // 已经登录而且还想去登录---不行
    if(to.path=="/login"||to.path=="/register"){
      //   /相当于根组件 因此还是home
      next('/')
    }else{
      // 用户已经登录了  访问的是非登录与注册
      // home---search  用户需要有信息 
    //  登录了且拥有用户信息 放行
    if(name){
      next()
    }else{
      // 登录了且没有用户信息  再路由跳转前获取用户信息
      // 先获取用户信息 再放行
      try {
      await store.dispatch('getUserInfo')
     next();
        
      } catch (error) {
        // token失效  重新登录
        await store.dispatch('userLogout')
        next('/login')
      }
      
    }
    }

  }else{
    // 用户未登录
    // 未登录 不能去交易相关、支付相关、（pay paysuccess)、个人中心
  //  未登录去上面这些路由---应该转到登录页
  let toPath = to.path;
  // if(toPath=='/trade'){ 字符串 可以用下面的写法
// 下面写法 直接用包不包含pay 直接一下子pay 和paysuccess包含了center的两个组件一样
//  indexof这样比上面的具体路径省事
if(toPath.indexOf('/trade')!=-1||toPath.indexOf('pay')!=-1||toPath.indexOf('/center')!=-1){
  //  把未登录的时候想去没有去成的信息 存储于地址栏中 路由
  next('/login?redirect='+toPath)
  }else{
  next()
     //  不是上面这些路由（home search shopcart）的话放行
 
  }
}})

export default router;